home *** CD-ROM | disk | FTP | other *** search
- /*
- * some useful definitions for memory allocation and string
- * handling
- */
-
- #define MODNAME "aux"
-
- #include "aux.h"
-
- #include <sys/time.h>
- #include <sys/times.h>
- #include <sys/param.h>
- #ifdef IRIS
- #include <task.h> /* for getpid */
- #endif
-
- #if PARIX
- char *rindex(char *s, char c)
- {
- char *p, *pi;
-
- for(pi=NULL, p=s; *p; p++) if (*p==c) pi=p;
- return pi;
- }
- #endif
-
- #ifdef CM5
- #include <cm/cmmd.h> /* for timer functions */
- #endif
-
- int list_mem;
- int mem_size;
- int mem_s=0, mem_pl=0, mem_grid=0, mem_bo=0, mem_nb=0;
-
- int memsize()
- {
- return 0;
- }
-
- char *checkalloc(p, len, deflen)
- char *p;
- int len, deflen;
- {
- if (p==NULL) {
- p = malloc(deflen);
- if (p==NULL) {
- fprintf(stderr,"Could not allocate memory.\n");
- exit(1);
- }
- }
- if (len<=deflen) return p;
- p = (char*)realloc(p,len);
- if (p==NULL) {
- fprintf(stderr,"Could not extend memory.\n");
- exit(1);
- }
- return p;
- }
-
- char *copy(str)
- char *str;
- {
- char *string;
- int l;
-
- if (str==NULL) return NULL;
- l = strlen(str)+1;
- string = (char *)malloc(l);
- if (string==NULL) {
- fprintf(stderr,"Could not string string.\n");
- exit(1);
- }
- strcpy(string, str);
- return(string);
- }
-
- char aux_buf[aux_bufsiz], aux_buf2[aux_bufsiz], *aux_bufp;
-
- char *substr(const char *str, int ofs, int len)
- {
- char *s;
-
- aux_bufnstring(s, len+1);
- bcopy(str+ofs, s, len);
- s[ofs+len] = '\0';
- return s;
- }
-
- char *stringf(char *format, ...)
- {
- char *p;
-
- aux_sprintf(p, format);
- return(p);
- }
-
- char *copydata(str, len)
- char *str;
- int len;
- {
- register char *s,*p;
-
- if (str==NULL) return NULL;
- s = (char *)malloc(len);
- if (s==NULL) {
- fprintf(stderr,"Could not allocate string.\n");
- exit(1);
- }
- p=s; s+=len;
- while (p<s) *(p++)=(*(str++));
- return(s-len);
- }
-
- char *append(s1, s2)
- char *s1, *s2;
- {
- register char *s;
-
- s = (char*)realloc(s1,strlen(s1)+strlen(s2)+1);
- return strcat(s,s2);
- }
-
-
- FILE *ropen(fn)
- char *fn;
- {
- FILE *fd;
-
- if (strcmp(fn,"-")==0) fd=fdopen(0,"r"); else fd=fopen(fn,"r");
- if (fd==NULL) {
- fprintf(stderr,"Could not open %s for input\n",fn);
- exit(1);
- }
- return fd;
- }
-
- FILE *wopen(fn)
- char *fn;
- {
- FILE *fd;
-
- if (strcmp(fn,"-")==0) fd=fdopen(1,"w"); else fd=fopen(fn,"w");
- if (fd==NULL) {
- fprintf(stderr,"Could not open %s for output\n",fn);
- exit(1);
- }
- return fd;
- }
-
- int debug_flag=1;
- int memory_flag=0;
-
- void warning(char *format, ...)
- {
- char *p;
-
- aux_sprintf(p, format);
- printf("%s Warning: %s", deb_pref, p);
- fflush(stdout);
- }
-
- int deb_crash=DEB_EXIT;
-
- void error(char *format, ...)
- {
- char *p;
-
- aux_sprintf(p, format);
- printf("%s %s\n", deb_pref, p);
- fflush(stdout);
- if (deb_crash==DEB_CORE) kill(getpid(),6);
- else exit(1);
- }
-
- char *deb_pref="";
- int deb_mode=DEB_CPU;
- double deb_cpu=-1, deb_real=-1;
-
- real time_temp=0.0;
-
- double realtime()
- {
- #ifdef PARIX
- return ((double)TimeNowLow())/(double)CLK_TCK_LOW;
- #else
- #ifdef CM5
- if (time_temp==0.0) {
- CMMD_node_timer_clear(0);
- CMMD_node_timer_start(0);
- }
- CMMD_node_timer_stop(0);
- time_temp = (real)CMMD_node_timer_elapsed(0);
- CMMD_node_timer_start(0);
- return time_temp;
- #else
- struct timeval tv;
- struct timezone tzv;
-
- gettimeofday(&tv, &tzv);
- /* debug("Time: %d seconds, %d microseconds, % 15.3f\n",
- tv.tv_sec, tv.tv_usec, (double)tv.tv_sec + 1e-6*(double)tv.tv_usec); */
- return (double)tv.tv_sec + 1e-6*(double)tv.tv_usec;
- #endif
- #endif
- }
-
- double cputime() {
- #ifdef CM5
- return realtime();
- #else
- struct tms buf;
-
- times(&buf);
- return (double)buf.tms_utime/(double)CLK_TCK;
- #endif
- }
-
-
- void deb_print(char *p)
- {
- char tform[]="%s%6.2f %s", aform[]="%s%6.2f %2d%% %s";
- real ct, rt;
- int eff;
-
- if (deb_cpu<0) deb_cpu=cputime();
- if (deb_real<0) deb_real=realtime();
- switch (deb_mode) {
- case DEB_NONE:
- printf("%s %s", deb_pref, p);
- break;
- case DEB_CPU:
- printf(tform, deb_pref, cputime()-deb_cpu, p);
- break;
- case DEB_REAL:
- printf(tform, deb_pref, realtime()-deb_real, p);
- break;
- case DEB_ALL:
- ct = cputime()-deb_cpu;
- rt = realtime()-deb_real;
- if (rt!=0) eff = (int)(ct*100/rt); else eff=99;
- if (eff>99) eff=99;
- printf(aform, deb_pref, rt, eff, p);
- break;
- case DEB_MEM:
- printf("%s %d %s", deb_pref, mem_size, p);
- break;
- default:
- error("Illegal debugging mode %d.\n", deb_mode);
- }
- deb_cpu = cputime();
- deb_real = realtime();
- fflush(stdout);
- }
-
- void pdebug(char *format, ...)
- {
- char *p;
-
- if (!debug_flag) return;
- aux_sprintf(p, format);
- deb_print(p);
- }
-
- void npdebug(char *format, ...)
- {
- char *p;
-
- if (!debug_flag) return;
- aux_sprintf(p, format);
- printf("%s", p);
- fflush(stdout);
- }
-
-
- #define time_check 1
- #define time_n1 20
- #define time_n2 16384
-
- real time_cpu0[time_n1], time_real0[time_n1];
- real time_cpu[time_n1], time_real[time_n1];
- char *time_names[time_n1];
-
- short time_ind[time_n2];
- short time_next;
- short time_last;
- short time_initflag=0;
-
- void time_init(void)
- {
- int i;
-
- for (i=0; i<time_n1; i++) {
- time_cpu[i]=time_cpu[i]=time_cpu0[i]=time_cpu0[i]=0;
- time_names[i]=NULL;
- }
- for (i=0; i<time_n2; i++) time_ind[i]=-1;
- time_next=0;
- time_last=0;
- time_initflag=1;
- }
-
- int time_label(char *str, int create)
- {
- int i, j;
- char *s;
-
- if (!time_initflag) error("Timer not initialized.");
- for (i=0, s=str; *s && i<time_n2; s++) i+=(int)*s;
- j = time_ind[i];
- if (j<0) {
- if (!create) error("Timer label \"%s\" not found.", str);
- if (time_next>=time_n1) error("Too many Timer labels.");
- time_ind[i] = j = time_next++;
- time_names[j] = copy(str);
- }
- #if time_check
- else if (strcmp(time_names[j], str))
- error("Time label conflict: %s and %s.\n", str, time_names[j]);
- #endif
- return j;
- }
-
- void time_start(char *str)
- {
- if (!time_initflag) time_init();
- time_last = time_label(str, 1);
- time_cpu0[time_last] = cputime();
- time_real0[time_last] = realtime();
- }
-
- void time_stop(char *str)
- {
- int i;
-
- i = time_label(str, 0);
- time_cpu[i] += cputime() - time_cpu0[i];
- time_real[i] += realtime() - time_real0[i];
- if (time_last==i) time_last = -1;
- }
-
- void time_reset(char *str)
- {
- int i;
-
- i = time_label(str, 0);
- time_cpu[i] = time_real[i] = 0;
- }
-
- real time_val(char *str)
- {
- int i;
-
- i = time_label(str, 0);
- return time_cpu[i];
- }
-
- real time_lap(char *str)
- {
- int i;
-
- i = time_label(str, 0);
- return cputime() - time_cpu0[i];
- }
-
- char *time_string_lap(char *str)
- {
- int i;
-
- i = time_label(str, 0);
- return stringf("cpu: %6.2f, real: %6.2f", cputime() - time_cpu0[i], realtime() - time_real0[i]);
- }
-
- void time_seq(char *s)
- {
- if (time_last>=0) {
- time_cpu[time_last] += cputime() - time_cpu0[time_last];
- time_real[time_last] += realtime() - time_real0[time_last];
- time_last = -1;
- }
- if (s) time_start(s);
- }
-
- void time_print(void)
- {
- int i;
- char *s;
-
- if (!time_initflag) error("Timer not initialized.");
- time_seq(NULL);
- s = "\nCumulative timing results:\n Label Real CPU\n";
- for (i=0; i<time_n1; i++) {
- if (!time_names[i]) break;
- s = stringf("%s%8s %10.3f %10.3f\n", s, time_names[i], time_real[i], time_cpu[i]);
- }
- printf("%s\n", s);
- }
-
-
- #if SRANDOM
- extern int rand();
- #else
- #ifndef DEC
- extern long random();
- #endif
- #endif
-
- real ran_real(void)
- {
- real r;
-
- #if SRANDOM
- r = (real)rand()/32768.0;
- #else
- r = (real)random()/2147483648.0;
- #endif
- /* printf("%g\n", r); */
- return r;
- }
-
- char *s_lst(int* p, int len)
- {
- char *s;
- int i;
-
- s = "";
- for (i=0; i<len; i++) s = stringf("%s %2d", s, p[i]);
- return s;
- }
-
-